package com.cloud.point.jvm;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 泛型参数
 *
 * @author 24373
 * @version 1.0
 * @date 2024-06-10 16:22
 */
public class TestGeneric {

    public static void main(String[] args) throws NoSuchMethodException {
        /**
         * 泛型擦除，擦除的是字节码上的泛型信息，可以看到 LocalVariableTypeTable 仍然保留了方法参数泛型的信息
         * 在取值时候，字节码会强制转换成所需类型；如int x = ((Integer)list.get(0)).intValue();
         */
        Method test = TestGeneric.class.getMethod("test", List.class, Map.class, String.class);
        Type[] types = test.getGenericParameterTypes();
        for (Type type : types) {
            /**
             * 判断是否为泛型类型
             */
            if (type instanceof ParameterizedType) {
                ParameterizedType parameterizedType = (ParameterizedType) type;
                System.out.println("原始类型 - " + parameterizedType.getRawType());
                // 获取泛型参数
                Type[] arguments = parameterizedType.getActualTypeArguments();
                for (int i = 0; i < arguments.length; i++) {
                    System.out.printf("泛型参数[%d] - %s\n", i, arguments[i]);
                }
            } else {
                System.out.println("非泛型类型" + type.getTypeName());
            }
        }
    }

    public Set<Integer> test(List<String> list, Map<Integer, Object> map, String str) {
        return null;
    }

}
